//验证服务器有效性

const sha1 = require('sha1')

//定义配置对象 
const config = require('../config')
const reply = require('./reply.js')
const template = require('./template.js')

const { getUserDataAsync,parseXMLAsync,formatMessage,obj2XMLAsync} = require('../utils/tool_.js')
module.exports = () => {
    return async (req,res,next) => {
        const {signature,echostr,timestamp,nonce} = req.query
        const {token} = config
        let sha1Str = sha1([token,timestamp,nonce].sort().join(''))
        /*
      微信服务器会发送两种类型的消息给开发者服务器
        1. GET请求
          - 验证服务器的有效性
        2. POST请求
          - 微信服务器会将用户发送的数据以POST请求的方式转发到开发者服务器上
     */
        if(req.method === 'GET'){
            if (sha1Str === signature) {
                // 如果一样，说明消息来自于微信服务器，返回echostr给微信服务器
                res.send(echostr);
              } else {
                // 如果不一样，说明不是微信服务器发送的消息，返回error
                res.end('error');
              }
        }else if(req.method === 'POST'){
            //微信服务器会将用户发送的数据以POST请求的方式转发到开发者服务器上
            //验证消息来自于微信服务器
            if (sha1Str !== signature) {
                //说明消息不是微信服务器
                res.end('error');
            }
            // console.log(req.query);
            /*
            { signature: '81ac17269e5e918e977fa5c91f2a863145c5032a',
                timestamp: '1535703917',
                nonce: '1998798155',
                openid: 'oAsoR1iP-_D3LZIwNCnK8BFotmJc' }  //用户的微信id
            */
            //接受请求体中的数据，流式数据
            const xmlData = await getUserDataAsync(req);
            /*
            <xml>
            <ToUserName><![CDATA[gh_4fe7faab4d6c]]></ToUserName>   // 开发者的id
            <FromUserName><![CDATA[oAsoR1iP-_D3LZIwNCnK8BFotmJc]]></FromUserName>  // 用户openid
            <CreateTime>1535704703</CreateTime>  // 发送的时间戳
            <MsgType><![CDATA[text]]></MsgType>  // 发送消息类型
            <Content><![CDATA[789]]></Content>   // 发送内容
            <MsgId>6595801476125116782</MsgId>   // 消息id 微信服务器会默认保存3天用户发送的数据，通过此id三天内就能找到消息数据，三天后就被销毁
            </xml>
            */
           //将xml数据解析为js对象
            const jsData = await parseXMLAsync(xmlData);
            /*
            { xml:
            { ToUserName: [ 'gh_4fe7faab4d6c' ],
                FromUserName: [ 'oAsoR1iP-_D3LZIwNCnK8BFotmJc' ],
                CreateTime: [ '1535705176' ],
                MsgType: [ 'text' ],
                Content: [ '111' ],
                MsgId: [ '6595803507644647874' ] } }
            */
           //格式化数据
            const message = formatMessage(jsData);
            // console.log(message);
            /*
            { ToUserName: 'gh_4fe7faab4d6c',
            FromUserName: 'oAsoR1iP-_D3LZIwNCnK8BFotmJc',
            CreateTime: '1535705946',
            MsgType: 'text',
            Content: '123123',
            MsgId: '6595806814769465978' }
            */
           console.log('收到用户发送的消息：',message)
           //返回响应给微信服务器
            let replyMessage = await reply(message)
            console.log(replyMessage)
             replyMessage = template(replyMessage) 
            console.log(replyMessage)

            res.send(replyMessage);
        }else{
            res.end('error');
        }
    }
}